/* --------------------------------------------------------------------------------------------
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for license information.
 * ------------------------------------------------------------------------------------------ */
import {
  createConnection,
  TextDocuments,
  ProposedFeatures,
  InitializeParams,
  CompletionItem,
  TextDocumentPositionParams,
  TextDocumentSyncKind,
  InitializeResult,
} from 'vscode-languageserver/node';

import { TextDocument } from 'vscode-languageserver-textdocument';

// 为服务器创建连接。该连接使用Node的IPC作为传输。
// 还包括所有预览/建议的LSP功能。
const connection = createConnection(ProposedFeatures.all);

// 创建一个简单的文本文档管理器。 文本文档管理器仅支持完整文档同步
const documents = new TextDocuments(TextDocument);

// 当服务器初始化时调用
connection.onInitialize((params: InitializeParams) => {
  const result: InitializeResult = {
    capabilities: {
      textDocumentSync: TextDocumentSyncKind.Incremental,
    },
  };
  return result;
});

// 当服务器初始化完成后调用
connection.onInitialized(() => {
  // 可以在这里添加初始化完成后的逻辑
});

// 当配置发生变化时调用
connection.onDidChangeConfiguration((change) => {
  // 可以在这里处理配置变化
});

// 当文档关闭时调用
documents.onDidClose((e) => {
  // 可以在这里处理文档关闭事件
});

// 当文档内容发生变化时调用
documents.onDidChangeContent((change) => {
  // console.log('change--监听文档变化-->',);
  // 发送消息到客户端
  connection.sendNotification('onDidChangeContent', change);
});

// 当监视的文件发生变化时调用
connection.onDidChangeWatchedFiles((_change) => {
  connection.console.log('We received a file change event');
  // 可以在这里处理文件变化事件
});

// 当用户请求代码补全时调用
connection.onCompletion(
  (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
    // 返回一个空的补全项列表
    return [];
  }
);

// 该处理程序为完成列表中选定的项目解析其他信息
connection.onCompletionResolve((item: CompletionItem): CompletionItem => {
  // 返回补全项本身
  return item;
});

// 使文本文档管理器在连接上侦听打开，更改和关闭文本文档事件
documents.listen(connection);

// 监听连接
connection.listen();
